package com.taiyi.sqltoy.starter.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * Taiyi SqlToy Plus 配置属性
 * 
 * @author taiyi
 * @since 1.0.0
 */
@Data
@ConfigurationProperties(prefix = "taiyi.sqltoy.plus")
public class TaiyiSqlToyPlusProperties {

    /**
     * 是否启用Taiyi SqlToy Plus功能
     */
    private boolean enabled = true;

    /**
     * 是否启用统一字段自动填充功能
     */
    private boolean enableUnifyFields = true;

    /**
     * 是否启用多租户支持
     */
    private boolean enableMultiTenant = true;

    /**
     * 租户字段名称
     */
    private String tenantField = "tenant_id";

    /**
     * 默认租户ID（用于测试环境）
     */
    private String defaultTenantId = "default";

    /**
     * 不需要租户过滤的表列表
     * 这些表在进行CRUD操作时不会自动添加租户ID过滤条件
     */
    private List<String> ignoreTenantTables = new ArrayList<>();

    /**
     * 统一字段配置
     */
    private UnifyFields unifyFields = new UnifyFields();

    /**
     * 用户上下文配置
     */
    private UserContext userContext = new UserContext();

    /**
     * 统一字段配置类
     */
    @Data
    public static class UnifyFields {
        
        /**
         * 创建人字段名
         */
        private String creatorField = "creator";
        
        /**
         * 更新人字段名
         */
        private String updaterField = "updater";
        
        /**
         * 创建时间字段名
         */
        private String createTimeField = "create_time";
        
        /**
         * 更新时间字段名
         */
        private String updateTimeField = "update_time";
        
        /**
         * 是否启用创建时间自动填充
         */
        private boolean enableCreateTime = false;
        
        /**
         * 是否启用更新时间自动填充
         */
        private boolean enableUpdateTime = false;
        
        /**
         * 默认创建人（用于测试环境）
         */
        private String defaultCreator = "system";
        
        /**
         * 强制更新的字段列表
         */
        private List<String> forceUpdateFields = new ArrayList<>();
    }

    /**
     * 用户上下文配置类
     */
    @Data
    public static class UserContext {
        
        /**
         * 用户上下文获取策略
         * 支持：jwt, security, threadlocal, custom
         */
        private String strategy = "threadlocal";
        
        /**
         * JWT Token中用户ID的claim名称
         */
        private String userIdClaim = "userId";
        
        /**
         * JWT Token中租户ID的claim名称
         */
        private String tenantIdClaim = "tenantId";
        
        /**
         * 自定义用户上下文提供者的Bean名称
         */
        private String customProviderBean;
        
        /**
         * 请求头中的租户ID字段名
         */
        private String tenantHeaderName = "X-Tenant-Id";
        
        /**
         * 请求头中的用户ID字段名
         */
        private String userHeaderName = "X-User-Id";
    }
}